home *** CD-ROM | disk | FTP | other *** search
- program listSHK;
-
- type str4 = string[4];
- thread = record
- cl: integer;
- sA,
- sB: long
- end;
-
- var headerFound: Boolean;
- b1, b2, b3, b4, b5, b6: byte;
- attribCount, versNo, storageType, class, i, j: integer;
- fileCount, totalThreads, fileType, extraType, sizeA, sizeB, iL: long;
- K2, id1, id2: str4;
- K1: string[6];
- fileName: string[32];
- a: file of byte;
- threads: array[1..32] of thread;
- months: array[0..11] of string[3];
-
- function toWord: integer;
- begin
- toWord := ord(b2) shl 8 + ord(b1)
- end;
-
- function toLong: long;
- begin
- toLong := long(b4) shl 24 + long(b3) shl 16 + b2 shl 8 + b1
- end;
-
- procedure ShowDate;
- begin
- if b1 + b2 + b3 = 0
- then write('[No Date]')
- else write(b3 + 1:2, '-', months[b2], '-', b1:2);
- writeln(' ', b6:2, ':', b5:2, ':', b4:2)
- end;
-
- begin
- K1 := 'N' + #$F5 + 'F' + #$E9 + 'l' + #$E5; { 'NuFile' }
- K2 := 'N' + #$F5 + 'F' + #$D8; { 'NuFx' }
- months[0] := 'Jan';
- months[1] := 'Feb';
- months[2] := 'Mar';
- months[3] := 'Apr';
- months[4] := 'Mar';
- months[5] := 'Jun';
- months[6] := 'Jul';
- months[7] := 'Aug';
- months[8] := 'Sep';
- months[9] := 'Oct';
- months[10] := 'Nov';
- months[11] := 'Dec';
- if ParamCount <> 1
- then begin
- writeln('Usage: listSHK pathname');
- halt(20)
- end
- else fileName := ParamStr(1) + '.SHK';
- assign(a, fileName);
- reset(a);
- if eof(a)
- then begin
- writeln('Could not find ''', fileName, '''');
- halt(20)
- end
- writeln;
- read(a, b1, b2, b3, b4, b5, b6);
- if chr(b1) + chr(b2) + chr(b3) + chr(b4) + chr(b5) + chr(b6) <> K1
- then begin
- writeln('Invalid master header!');
- close(a);
- halt(20)
- end;
-
- { *** for now, skip master header CRC *** }
- for i := 1 to 2
- do read(a, b1);
-
- read(a, b1, b2, b3, b4);
- fileCount := toLong;
-
- { *** for now, skip rest of master header *** }
- for i := 1 to 36
- do read(a, b1);
-
- while fileCount > 0
- do begin
-
- read(a, b1, b2, b3, b4);
- if chr(b1) + chr(b2) + chr(b3) + chr(b4) <> K2
- then begin
- writeln('Invalid header!');
- close(a);
- halt(20)
- end;
-
- { *** for now, skip header CRC *** }
- read(a, b1, b2);
-
- read(a, b1, b2);
- attribCount := toWord;
- {
- writeln('Number of attribute bytes = ', attribCount)
- }
- read(a, b1, b2);
- versNo := toWord;
- {
- writeln('Version number needed = ', versNo)
- }
- read(a, b1, b2, b3, b4);
- totalThreads := toLong;
- {
- writeln('Threads = ',totalThreads)
- }
- { *** for now, skip three fields *** }
- for i := 1 to 8
- do read(a, b1);
-
- read(a, b1, b2, b3, b4);
- fileType := toLong;
- writeln('File type = ', fileType)
-
- read(a, b1, b2, b3, b4);
- extraType := toLong;
- writeln('Extra type = ', extraType)
-
- read(a, b1, b2);
- storageType := toWord;
- writeln('Storage type = ', storageType)
-
- read(a, b4, b5, b6, b1, b2, b3);
- write('Created: ');
- ShowDate;
- read(a, b1, b2);
-
- read(a, b4, b5, b6, b1, b2, b3);
- write('Modified: ');
- ShowDate;
- read(a, b1, b2);
-
- read(a, b4, b5, b6, b1, b2, b3);
- write('Archived: ');
- ShowDate;
- read(a, b1, b2);
-
- if versNo = 0
- then begin
- read(a, b1, b2, b3, b4, b5, b6);
- read(a, b1, b2);
- sizeA := toWord;
- write('File name is ''');
- for iL := 1 to sizeA
- do begin
- read(a, b1);
- write(chr(b1))
- end;
- writeln('''');
- end
- else read(a, b1, b2, b3, b4);
-
- for i := 1 to totalThreads
- do begin
- {
- writeln('Thread ', i, ':');
- }
- read(a, b1, b2);
- class := toWord;
- threads[i].cl := class;
- case class of
- 0,
- 2,
- 3: begin
- for j := 1 to 6
- do read(a, b1);
- read(a, b1, b2, b3, b4);
- sizeA := toLong;
- read(a, b1, b2, b3, b4);
- sizeB := toLong;
- {
- writeln(sizeA:6, sizeB:6)
- }
- threads[i].sA := sizeA;
- threads[i].sB := sizeB
- end;
- else begin
- for j := 1 to 14
- do read(a, b1);
- writeln('Found class ', class, ' in thread ', i);
- writeln('Aborting!');
- close(a);
- halt(20)
- end
- end
- end;
- for i := 1 to totalThreads
- do begin
- sizeA := threads[i].sA;
- sizeB := threads[i].sB;
- case threads[i].cl of
- 3: begin
- write('File name is ''');
- for iL := 1 to sizeA
- do begin
- read(a, b1);
- write(chr(b1))
- end;
- writeln('''');
- if sizeA < sizeB
- then for iL := 1 to sizeB - sizeA
- do read(a, b1)
- end;
- 0: begin
- if sizeA > 0
- then begin
- writeln('Message is:');
- write(' ');
- for iL := 1 to sizeA
- do begin
- read(a, b1);
- if b1 = 13
- then begin
- writeln;
- write(' ')
- end
- else write(chr(b1))
- end;
- writeln
- end;
- if sizeA < sizeB
- then for iL := 1 to sizeB - sizeA
- do read(a, b1)
- end;
- 2: begin
- for iL := 1 to sizeB
- do read(a, b1)
- end
- end
- end;
- writeln;
- fileCount := fileCount - 1
- end;
- close(a)
- end.
- { Old logic to scan for file header record
- headerFound := false;
- repeat
- read(a, b1);
- if chr(b1) = K2[1]
- then begin
- read(a, b2);
- if chr(b2) = K2[2]
- then begin
- read(a, b3);
- if chr(b3) = K2[3]
- then begin
- read(a, b4);
- if chr(b4) = K2[4]
- then headerFound := true
- end
- end
- end
- until headerFound;
- }
-